from django.db import models
from datetime import date, datetime
from django.shortcuts import get_list_or_404
from django.db.models import signals

class Cliente(models.Model):

	class Meta:
            ordering = ('-nome',)
            verbose_name = 'Cliente'
            verbose_name_plural = 'Clientes'

        foto = models.ImageField( upload_to="foto_cliente", height_field=None, width_field=None, blank=True, help_text="Foto do cliente")
	nome = models.CharField(max_length=100, help_text="Nome do cliente")
        ativo = models.BooleanField(help_text="Estado do Cliente(ativo ou nao)")
        endereco = models.CharField(max_length=255, blank=True, help_text="Endereco do cliente")
	descricao = models.TextField(blank=True, help_text="Descricao do cliente")
        valor_devedor = models.DecimalField(max_digits=10, decimal_places=2, default=0)
	
	def get_absolute_url(self):
		return '/cliente/%d/'%self.id
	
	def __unicode__(self):
		return u"%s" % self.nome

        def salva_valor(self):
            try:
                total = 0
                valor_cliente = get_list_or_404(Venda , cliente=self, pago=False)
                for valor in valor_cliente:
                    total = total + valor.valor_total
                self.valor_devedor = total
                self.save()
            except:
                self.valor_devedor = 0
                self.save()

class Fornecedor(models.Model):

	class Meta:
            ordering = ('-nome',)
            verbose_name = 'Fornecedor'
            verbose_name_plural = 'Fornecedores'

        foto = models.ImageField( upload_to="foto_fornecedor", height_field=None, width_field=None, blank=True, help_text="Foto do Fornecedor")
	nome = models.CharField(max_length=100, help_text="Nome do Fornecedor")
        ativo = models.BooleanField(help_text="Estado do Fornecedor(ativo ou nao)")
        endereco = models.CharField(max_length=255, blank=True, help_text="Endereco do Fornecedor")
	descricao = models.TextField(blank=True, help_text="Descricao do Fornecedor")
        valor_devedor = models.DecimalField(max_digits=10, decimal_places=2, default=0)

	def get_absolute_url(self):
		return '/fornecedor/%d/'%self.id

	def __unicode__(self):
		return u"%s" % self.nome


        def salva_valor(self):
            try:
                total = 0
                valor_produto = get_list_or_404(Produto , fornecedor=self, pago=False)
                for produto in valor_produto:
                    total = total + produto.valor_compra*produto.quantidade
                self.valor_devedor = total
                self.save()
            except:
                self.valor_devedor = 0
                self.save()


class Produto(models.Model):

	class Meta:
            ordering = ('-codigo',)
            verbose_name = 'Produto'
            verbose_name_plural = 'Produtos'

        foto = models.ImageField( upload_to="foto_produto", height_field=None, width_field=None, blank=True, help_text="Foto do Produto")
        ativo = models.BooleanField(help_text="Estado do Produto(ativo ou nao)")
        codigo = models.CharField(max_length=20, help_text="Codigo do Produto")
        nome = models.CharField(max_length=100, help_text="Nome do Produto")
        marca = models.CharField(max_length=100, help_text="Marca do Produto")
        pago = models.BooleanField(help_text="Estado do Produto(pago ou nao)")
        fornecedor = models.ForeignKey(Fornecedor, help_text="Fornecedor do Produto")
        valor_compra = models.DecimalField(max_digits=10, decimal_places=2, help_text="Valor de compra do Produto")
        valor_venda = models.DecimalField(max_digits=10, decimal_places=2, help_text="Valor de venda do Produto")
        quantidade = models.SmallIntegerField(help_text="Quantidade de Produto comprado")
        quantidade_disponivel = models.SmallIntegerField(help_text="Quantidade de Produto disponivel no Estoque")
        data_de_compra = models.DateTimeField(default=datetime.now, blank=True, help_text="Data de compra do Produto")
	descricao = models.TextField(blank=True, help_text="Descricao do Produto")

	def get_absolute_url(self):
		return '/produto/%d/'%self.codigo

	def __unicode__(self):
		return u"%s-%s(%d)" % (self.codigo, self.nome, self.quantidade_disponivel)


class Venda(models.Model):

    class Meta:
        ordering = ('-cliente',)
        verbose_name = 'Venda'
        verbose_name_plural = 'Vendas'

    cliente = models.ForeignKey(Cliente, help_text="Cliente da Venda")
    pago = models.BooleanField(help_text="Estado da Venda(pago ou nao)")
    data_da_venda = models.DateTimeField(default=datetime.now, blank=True, help_text="Data da Venda")
    valor_total = models.DecimalField(max_digits=10, decimal_places=2, help_text="Valor total da Venda")


    def get_absolute_url(self):
            return '/venda/%d/'%self.id

    def __unicode__(self):
            return u"%d" % (self.id)


class ProdutoVendido(models.Model):

    venda = models.ForeignKey(Venda)
    produto = models.ForeignKey(Produto, help_text="Produto Vendido")
    valor = models.DecimalField( max_digits=10, decimal_places=2, help_text="Valor do Produto")
    quantidade = models.SmallIntegerField(default=1, help_text="Quantidade de Produto")

    def __unicode__(self):
            return u"%s" % self.produto
            
def produtoVendido_post_save(sender, instance, created, **kwargs):
    if(created):
        instance.produto.quantidade_disponivel = instance.produto.quantidade_disponivel - instance.quantidade
        instance.produto.save()
        
signals.post_save.connect(produtoVendido_post_save, sender=ProdutoVendido)
  

class FecharVenda(models.Model):

    PAG_CHOICES = (
        ('Dinheiro', 'Dinheiro'),
        ('Cheque', 'Cheque'),
        ('Cartao', 'Cartao'),
        ('Crediario', 'Crediario'),
    )

    class Meta:
        ordering = ('-cliente',)
        verbose_name = 'Fechar Venda'
        verbose_name_plural = 'Fechar Vendas'

    cliente = models.ForeignKey(Cliente, help_text="Cliente da Venda")
    forma_de_pagamento = models.CharField(max_length=9, choices=PAG_CHOICES, help_text="Forma de Pagamento")
    valor_total = models.DecimalField(max_digits=10, decimal_places=2, help_text="Valor total da Venda")


    def get_absolute_url(self):
            return '/fecharvenda/%d/'%self.id

    def __unicode__(self):
            return u"%d" % (self.id)


class ParcelasVenda(models.Model):

    fechar_venda = models.ForeignKey(FecharVenda)
    valor = models.DecimalField( max_digits=10, decimal_places=2, help_text="Valor da parcela")
    data_de_pagamento = models.DateField(default=date.today, blank=True, help_text="Data de pagamento")

    def __unicode__(self):
            return u"%d - %s" % (self.valor, self.data_de_pagamento)



class FecharCompra(models.Model):

    PAG_CHOICES = (
        ('Dinheiro', 'Dinheiro'),
        ('Cheque', 'Cheque'),
        ('Cartao', 'Cartao'),
        ('Crediario', 'Crediario'),
    )

    class Meta:
        ordering = ('-fornecedor',)
        verbose_name = 'Fechar Compra'
        verbose_name_plural = 'Fechar Compras'

    fornecedor = models.ForeignKey(Fornecedor, help_text="Fornecedor da Produto")
    forma_de_pagamento = models.CharField(max_length=9, choices=PAG_CHOICES, help_text="Forma de Pagamento")
    valor_total = models.DecimalField(max_digits=10, decimal_places=2, help_text="Valor total da Compra")


    def get_absolute_url(self):
            return '/fecharcompra/%d/'%self.id

    def __unicode__(self):
            return u"%d" % (self.id)


class ParcelasCompra(models.Model):

    fechar_compra = models.ForeignKey(FecharCompra)
    valor = models.DecimalField( max_digits=10, decimal_places=2, help_text="Valor da parcela")
    data_de_pagamento = models.DateField(default=date.today, blank=True, help_text="Data de pagamento")

    def __unicode__(self):
            return u"%d - %s" % (self.valor, self.data_de_pagamento)